#!/bin/bash

# 1. パスの設定
RESOURCE_DIR=$(cd "$(dirname "$0")"; pwd)
CONTENTS_DIR=$(dirname "$RESOURCE_DIR")
GS_EXEC="$RESOURCE_DIR/gs_universal"
LIB_DIR="$CONTENTS_DIR/libs"

if [ -d "$LIB_DIR" ]; then
    export DYLD_LIBRARY_PATH="$LIB_DIR${DYLD_LIBRARY_PATH:+:$DYLD_LIBRARY_PATH}"
fi

# 2. 実行中のGSのバージョンを取得 (例: 10.06.0)
GS_VERSION=$("$GS_EXEC" --version 2>/dev/null)

if [ -z "$GS_VERSION" ]; then
    echo "エラー: Ghostscript の起動に失敗しました。アプリ内ライブラリを確認してください"
    exit 1
fi

# 3. そのバージョンに一致するフォルダを優先的に探す
if [ -d "$CONTENTS_DIR/$GS_VERSION" ]; then
    GS_VER_DIR="$CONTENTS_DIR/$GS_VERSION"
else
    # 見つからない場合は従来通り最初に見つかった数字フォルダを使う
    GS_VER_DIR=$(ls -d "$CONTENTS_DIR"/[0-9]* 2>/dev/null | head -n 1)
fi

# 4. GS_LIBの設定
if [ -n "$GS_VER_DIR" ]; then
    export GS_LIB="$GS_VER_DIR/Resource/Init:$GS_VER_DIR/Resource:$GS_VER_DIR/lib:$GS_VER_DIR/kanji"
fi

# 3. フォントパスの追加（埋め込み・アウトライン化の安定性向上）
export GS_FONTPATH="$GS_FONTPATH:/Library/Fonts:/System/Library/Fonts"

# 4. gs実行ファイルの存在と実行権限の確認
if [ ! -e "$GS_EXEC" ]; then
  echo "エラー: Ghostscript 実行ファイルが見つかりません: $GS_EXEC"
  exit 1
fi

chmod +x "$GS_EXEC" || {
  echo "エラー: $GS_EXEC に実行権限を付与できませんでした"
  exit 1
}

processed=0
failed=0
temp_files=()

cleanup_temp_files() {
    for tmp in "${temp_files[@]}"; do
        if [ -n "$tmp" ] && [ -f "$tmp" ]; then
            rm -f "$tmp"
        fi
    done
}

trap cleanup_temp_files EXIT

for f in "$@"
do
    if [ ! -f "$f" ]; then
      continue
    fi

    processed=$((processed + 1))

    dir=$(dirname "$f")
    filename=$(basename "$f")
    base="${filename%.*}"

    # 新しいファイル名： 元の名前_OL_300.pdf
    outfile="$dir/${base}_OL_300.pdf"
    echo "処理中: $filename ..."

    # PDF内部構造の修復・正規化
    repaired_pdf=$(mktemp "${TMPDIR:-/tmp}/pdf-reconstructor-repaired.XXXXXX.pdf")
    temp_files+=("$repaired_pdf")
    echo "PDF内部構造を修復・再生成しています..."

    "$GS_EXEC" -sDEVICE=pdfwrite \
               -dCompatibilityLevel=1.7 \
               -dPDFSETTINGS=/prepress \
               -dNOPAUSE -dQUIET -dBATCH \
               -sColorConversionStrategy=RGB \
               -dProcessColorModel=/DeviceRGB \
               -dOverrideICC \
               -dUseCIEColor=false \
               -dDetectDuplicateImages=true \
               -dCompressFonts=true \
               -sOutputFile="$repaired_pdf" \
               "$f"

    if [ $? -ne 0 ] || [ ! -s "$repaired_pdf" ]; then
        echo "エラー: $filename のPDF内部構造の修復に失敗しました"
        failed=$((failed + 1))
        continue
    fi

    # Ghostscript実行：アウトライン化 + 300ppi制限
    "$GS_EXEC" -sDEVICE=pdfwrite \
               -dCompatibilityLevel=1.3 \
               -dPDFSETTINGS=/prepress \
               -dNOPAUSE -dQUIET -dBATCH \
               -dNoOutputFonts=true \
               -sColorConversionStrategy=RGB \
               -dProcessColorModel=/DeviceRGB \
               -dOverrideICC \
               -dUseCIEColor=false \
               -dColorImageDownsampleType=/Bicubic \
               -dColorImageResolution=300 \
               -dGrayImageDownsampleType=/Bicubic \
               -dGrayImageResolution=300 \
               -dMonoImageDownsampleType=/Bicubic \
               -dMonoImageResolution=300 \
               -dDownsampleColorImages=true \
               -dDownsampleGrayImages=true \
               -dDownsampleMonoImages=true \
               -sOutputFile="$outfile" \
               "$repaired_pdf"

    if [ $? -eq 0 ]; then
        echo "完了: $outfile"
    else
        echo "エラー: $filename の変換に失敗しました"
        failed=$((failed + 1))
    fi
done

# 完了通知（全て成功したときだけ）
if [ "$processed" -gt 0 ] && [ "$failed" -eq 0 ]; then
  echo "文字のアウトラインと最大画像を300ppiへの変換が完了しました"
  echo "元ファイルと同じ場所に「元ファイル名_OL_300.pdf」として保存しました。"
  osascript -e 'display notification "アウトライン・300ppi変換が完了しました" with title "PDF Reconstructor"' >/dev/null 2>&1 || true
  echo "--- 全ての処理が終了しました ---"
else
  if [ "$processed" -eq 0 ]; then
    echo "エラー: 処理対象のファイルがありませんでした"
  else
    echo "エラー: $failed 件の変換に失敗しました（完了通知は表示しません）"
  fi
  echo "--- 処理が終了しました ---"
  exit 1
fi
